﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Web7;
using Web7.ExceptionHandling;
using Web7.Container.ExceptionPublishers;
using System.Xml.Linq;
using Web7.Tests.Extensions;

namespace Web7.Tests.Web7.ExceptionHandling
{
	/// <summary>
	/// ExceptionPublishTest 的摘要说明
	/// </summary>
	[TestClass]
	public class ExceptionPublishTest
	{
		public ExceptionPublishTest()
		{
		}



		[ClassInitialize]
		public static void Init(TestContext context)
		{
			System.Web.HttpContext.Current = new System.Web.HttpContext(
				new System.Web.HttpRequest("default.aspx","http://www.web7.com", null),
				new System.Web.HttpResponse(null));
		}

		private TestContext testContextInstance;

		/// <summary>
		///获取或设置测试上下文，该上下文提供
		///有关当前测试运行及其功能的信息。
		///</summary>
		public TestContext TestContext
		{
			get
			{
				return testContextInstance;
			}
			set
			{
				testContextInstance = value;
			}
		}

		#region 附加测试特性
		//
		// 编写测试时，可以使用以下附加特性:
		//
		// 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
		// [ClassInitialize()]
		// public static void MyClassInitialize(TestContext testContext) { }
		//
		// 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
		// [ClassCleanup()]
		// public static void MyClassCleanup() { }
		//
		// 在运行每个测试之前，使用 TestInitialize 来运行代码
		// [TestInitialize()]
		// public void MyTestInitialize() { }
		//
		// 在每个测试运行完之后，使用 TestCleanup 来运行代码
		// [TestCleanup()]
		// public void MyTestCleanup() { }
		//
		#endregion


		[TestMethod]
		public void ExceptionPublish()
		{
			Exception ex;

			try
			{
				throw new NotImplementedException();
			}
			catch (NotImplementedException e)
			{
				ex = e;
				Assert.IsTrue(ex.Publish());
			}

			Assert.IsFalse(ex.PublishTo<AyncLogExceptionPublisher>());
			Assert.IsFalse(ex.PublishTo<WebResponseExceptionPublisher>());


			Assert.IsTrue(ExceptionPublisherManager.AllPublishers.Count > 0);

		}


		[TestMethod]
		public void ExceptionLeveledPublish()
		{
			Exception ex = new ApplicationException("application is now in some bad status");

			Assert.IsFalse(ex.Publish(OperationProcessLevel.Fatal));
			Assert.AreEqual(OperationProcessLevel.Fatal, ex.GetLevel());

		}


		[TestMethod]
		public void NullXMLElement()
		{
			XElement xdoc;

			Assert.IsNull(System.Web.Hosting.HostingEnvironment.MapPath("~/"));
			Assert.IsNotNull(System.Web.HttpContext.Current);

			xdoc = XElement.Load(System.Web.HttpContext.Current.Server.MapPath("~/Configs/Web7.config"));

			Assert.IsNull(xdoc);
		}

	}
}

